#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"
#include "TypeDefin.h"

using namespace std;

/**
 *
 * 328. 奇偶链表
中等
665
相关企业
给定单链表的头节点 head ，将所有索引为奇数的节点和索引为偶数的节点分别组合在一起，然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 ， 第二个节点的索引为 偶数 ，以此类推。

请注意，偶数组和奇数组内部的相对顺序应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
示例 1:
输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]
示例 2:
输入: head = [2,1,3,5,6,4,7]
输出: [2,3,6,7,1,5,4]
 *
 * */


ListNode *oddEvenList(ListNode *head) {
    if (!head)
        return head;
    ListNode *oddPtr = nullptr;
    ListNode *oddPtrReal = nullptr;
    ListNode *evenPtr = nullptr;
    ListNode *realEventPtr = nullptr;
    int count = 1;
    while (head) {
        ListNode *nextHead = nullptr;
        //如果是偶数
        if (count % 2 == 0) {
            nextHead = head->next;
            if (!evenPtr) {
                evenPtr = head;
                realEventPtr = head;
                evenPtr->next = nullptr;
            } else {
                evenPtr->next = head;
                evenPtr = evenPtr->next;
                evenPtr->next = nullptr;
            }

        } else {
            nextHead = head->next;
            if (!oddPtr) {
                oddPtrReal = head;
                oddPtr = head;
                oddPtr->next = nullptr;
            } else {
                oddPtr->next = head;
                oddPtr = oddPtr->next;
                oddPtr->next = nullptr;
            }
        }

        head = nextHead;
        count++;
    }

    oddPtr->next = realEventPtr;

    return oddPtrReal;
}